/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package acm;

import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 * Esta clase el ejercicio ACM 9.1 para ordenar letras y numeros en orden ascendente.
 */
public class Incremente{
    
    //declaracion de los atributos de la clase
    List<String> lista_datos = new ArrayList<String>();
    List<Integer> lista_numeros = new ArrayList<Integer>();
    List<String> lista_letras = new ArrayList<String>();
    String cadena = "";
    
    /**
     * Constructor de la clase Incremente.
     */
    public Incremente() {
    	
    }
    /**
     * Este metodo ordena los caracteres ingresados por el usuario.
     */
    public String ordenar() {
        
        int aux;
        String aux2;
        //ciclo que separa los numeros de las letras
        for (int cont = 0; cont < this.lista_datos.size(); cont++) {
            if (solo_numeros(this.lista_datos.get(cont)) == true) {
                this.lista_numeros.add(Integer.parseInt(this.lista_datos.get(cont)));
            } else {
                this.lista_letras.add(this.lista_datos.get(cont));
            }
        }
        
        for (int cont = 0; cont < this.lista_numeros.size(); cont++) {  //Metodo que hace ordenamiento burbuja
            for (int cont2 = 0; cont2 < this.lista_numeros.size() - 1; cont2++) {
                if (this.lista_numeros.get(cont) < this.lista_numeros.get(cont2)) {
                    aux = this.lista_numeros.get(cont);
                    this.lista_numeros.set(cont, this.lista_numeros.get(cont2));
                    this.lista_numeros.set(cont2, aux);

                }
            }
        }
        for (int cont = 0; cont < this.lista_letras.size(); cont++) {  //Metodo que hace ordenamiento burbuja
            for (int cont2 = 0; cont2 < this.lista_letras.size() - 1; cont2++) {
                if ((int) this.lista_letras.get(cont).charAt(0) < (int) this.lista_letras.get(cont2).charAt(0)) {
                    aux2 = this.lista_letras.get(cont);
                    this.lista_letras.set(cont, this.lista_letras.get(cont2));
                    this.lista_letras.set(cont2, aux2);

                }
            }
        }
        for (int cont = 0; cont < this.lista_letras.size(); cont++) {
            cadena += this.lista_letras.get(cont)+"\n";
        }
        for (int cont = 0; cont < this.lista_numeros.size(); cont++) {
        	cadena += this.lista_numeros.get(cont)+"\n";
        }
        
        return cadena;
    }

    /**
     * Este metodo recibe y valida los caracteres ingresados por el usuario
     * @param caracter Recibe el caracter que puede ser letra o numero.
     * @return Retorna true si este caracter es una letra mayuscula o minuscula o numero entero y false en caso contrario.
     */
    public boolean ingresarDatos(String caracter) {
		if(caracter.length() == 1){
			if ((int) caracter.charAt(0) >= 65 && (int) caracter.charAt(0) <= 90 ||(int) caracter.charAt(0) >= 97 && (int) caracter.charAt(0) <= 122 || (int) caracter.charAt(0) >= 48 && (int) caracter.charAt(0) <= 57) {
				this.lista_datos.add(caracter);
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
    }

    /**
     * Este metodo valida si el parametro ingresado es un numero entero.
     * @param palabra Recibe un caracter como parametro.
     * @return Retorna true si se trata de un numero entero efectivamente o false en caso contrario.
     */
    public boolean solo_numeros(String palabra) {
        try {
            Integer.parseInt(palabra);
            return true;
        } catch (NumberFormatException excepcion) {
            return false;
        }
    }
}
